#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
GPS地址解析服务
用于根据经纬度获取详细地址信息
"""

import logging
import requests
import time
from typing import Dict, List, Any
from urllib.parse import urljoin

logger = logging.getLogger(__name__)

class GPSAddressService:
    """GPS地址解析服务类"""
    
    def __init__(self, api_url: str, api_user: str = None, api_pwd: str = None):
        """
        初始化地址解析服务
        
        Args:
            api_url: GPS API基础URL
            api_user: API用户名（可选）
            api_pwd: API密码（可选）
        """
        self.api_url = api_url.rstrip('/')
        self.api_user = api_user
        self.api_pwd = api_pwd
        self.session = requests.Session()
        self.session.headers.update({
            'User-Agent': 'GPS-Address-Service/1.0'
        })
    
    def get_address_by_coordinates(self, lat: float, lng: float, map_type: str = "BAIDU") -> Dict[str, Any]:
        """
        根据经纬度获取地址信息
        
        Args:
            lat: 纬度
            lng: 经度
            map_type: 地图类型，默认BAIDU
            
        Returns:
            包含地址信息的字典
        """
        try:
            # 构建请求URL
            poi_url = urljoin(self.api_url, '/POI')
            params = {
                'lat': lat,
                'lon': lng,
                'map': map_type
            }
            
            logger.info(f"请求地址解析: lat={lat}, lng={lng}, map={map_type}")
            
            response = self.session.get(poi_url, params=params, timeout=10)
            response.raise_for_status()
            
            # GPS API返回的是纯文本地址
            address_text = response.text.strip()
            
            if address_text:
                return {
                    'success': True,
                    'address': address_text,
                    'coordinates': {
                        'lat': lat,
                        'lng': lng
                    }
                }
            else:
                return {
                    'success': False,
                    'address': '未知位置',
                    'error': '地址解析结果为空'
                }
                
        except requests.exceptions.Timeout:
            logger.warning(f"地址解析超时: lat={lat}, lng={lng}")
            return {
                'success': False,
                'address': '地址解析超时',
                'error': '请求超时'
            }
        except requests.exceptions.RequestException as e:
            logger.error(f"地址解析请求失败: {str(e)}")
            return {
                'success': False,
                'address': '地址解析失败',
                'error': str(e)
            }
        except Exception as e:
            logger.error(f"地址解析异常: {str(e)}")
            return {
                'success': False,
                'address': '地址解析异常',
                'error': str(e)
            }
    
    def batch_get_addresses(self, coordinates_list: List[Dict[str, float]], map_type: str = "BAIDU") -> List[Dict[str, Any]]:
        """
        批量获取地址信息
        
        Args:
            coordinates_list: 坐标列表，每个元素包含lat和lng
            map_type: 地图类型，默认BAIDU
            
        Returns:
            地址信息列表
        """
        results = []
        
        for coord in coordinates_list:
            lat = coord.get('lat')
            lng = coord.get('lng')
            
            if lat is None or lng is None:
                results.append({
                    'success': False,
                    'address': '坐标无效',
                    'error': '坐标参数缺失',
                    'coordinates': coord
                })
                continue
            
            # 调用单个地址解析
            address_result = self.get_address_by_coordinates(lat, lng, map_type)
            results.append(address_result)
            
            # 添加小延迟避免过快请求
            time.sleep(0.1)
        
        return results
    
    def format_address_for_display(self, address_result: Dict[str, Any]) -> str:
        """
        格式化地址用于显示
        
        Args:
            address_result: 地址解析结果
            
        Returns:
            格式化后的地址字符串
        """
        if address_result.get('success'):
            return address_result.get('address', '未知位置')
        else:
            return f"地址解析失败: {address_result.get('error', '未知错误')}"